Rundeck: スクリプトファイル読み込みによるジョブの実行
OSSのジョブ管理ツール『Rundeck』ではスクリプトファイルを読みこませる事でその内容をジョブのステップの1つとする事が出来ます。当エントリではその手順についてご紹介したいと思います。
もくじ
Rundeck環境導入のEC2サーバに配備したスクリプトファイルを読み込んで実行
まずこちらで紹介するのが、Rundeckを導入した環境(EC2)配下にプログラムを配備し、そのファイルを読み込んで実行させるというものです。EC2(Amazon Linux)インスタンス上にRundeckサーバを導入するのは以前のエントリでご紹介しました。ここではその環境下で今回説明する手順を進めるという想定で行きます。
まずは実行プログラムの作成。シェルスクリプトでシンプルに文字情報と、dateコマンドによる日付時刻情報を出力するプログラムを作成しました。プログラムの配置パスを、ひとまずは/home/ec2-user/rundeck-job-test.shとしました。
$ vi /home/ec2-user/rundeck-job-test.sh #!/bin/sh echo "rundeck job start." date echo "rundeck job end."
実行するとこんな感じで情報が出ます。
$ chmod +x rundeck-job-test.sh $ ./rundeck-job-test.sh rundeck job start. 2015年 11月 23日 月曜日 14:19:01 JST rundeck job end.
任意のジョブを作成し、ステップを作成します。ここでは『Script file or URL』を選択。
上記で指定したパスを『File Paht/URL』に指定、保存した上でジョブとして作成します。
ジョブ実行。するとエラーとなってしまいました...
エラーログを確認してみます。どうやら権限が足りない様です。
14:23:23 localhost 1. /home/ec2-user/rundeck-job-test.sh Failed dispatching to node localhost: error writing to tempfile: /home/ec2-user/rundeck-job-test.sh (Permission denied) 14:23:23 Execution failed: 2: [Workflow result:, step failures: { 1=Dispatch failed on 1 nodes: [localhost: IOFailure: error writing to tempfile: /home/ec2-user/rundeck-job-test.sh (Permission denied)]}, Node failures: {localhost=[IOFailure: error writing to tempfile: /home/ec2-user/rundeck-job-test.sh (Permission denied)]}, flow control: Continue, status: failed]
実行ユーザーを確認する為にwhoamiコマンドを実行するステップを追加し、上記実行ステップの前に設定してみます。
再度実行。whoamiコマンドの実行結果にはrundeckと表示されました。どうやらRundeckインストール時にこのユーザーが作成されていて、Rundeckの処理実行においてはこのユーザーで諸々の処理が行われている様です。
導入時点でのユーザーの一覧を確認してみます。パスワードファイルの内容を見てみると(『Linux ユーザー 一覧』で確認する術がありました)、確かに、rundeckというユーザーの存在を確認出来ました。
root : : ec2-user rundeck
Rundeck実行ユーザー(rundeck)用に環境と実行ファイルを整えてみたいと思います。ここでは/home 配下にこのユーザー用のスクリプト格納ディレクトリを用意し、所有者もrundeckユーザーに変更しました。
$ sudo mkdir /home/rundeck/ $ sudo mkdir /home/rundeck/scripts $ sudo cp /home/ec2-user/rundeck-job-test.sh /home/rundeck/scripts/ $ sudo chown -R rundeck.rundeck /home/rundeck/ $ cd /home/ $ ll 合計 8 drwx------ 4 ec2-user ec2-user 4096 11月 23 14:46 ec2-user drwxr-xr-x 3 rundeck rundeck 4096 11月 23 15:01 rundeck $ cd rundeck/ $ ll 合計 4 drwxr-xr-x 2 rundeck rundeck 4096 11月 23 15:02 scripts $ cd scripts/ $ ll 合計 4 -rwxr-xr-x 1 rundeck rundeck 65 11月 23 15:02 rundeck-job-test.sh $
実行するスクリプトファイルのパスも上記変更を加えた内容に変更します。
再度ジョブ実行。今度は権限周りの問題もクリアされたようで、ちゃんと動きました。
参考: Pythonスクリプトを実行させる場合
上記ではシェルスクリプトファイルを設定してみましたが、他のスクリプトファイルも実行させたい、という要望もあるかと思います。ここでは一例としてPythonスクリプトをRundeckで実行させる場合のポイントについて補足しておこうと思います。 まずはRundeckサーバ上でPythonを実行可能な状態であるかどうかを確認します。EC2サーバ(Amazon Linux)であれば環境作成時にPythonはインストール済となっているので問題ありませんね。
$ python --version Python 2.7.10
Rundeck上のこのフォーマットで実行させる場合の1つの手段としては、実行権限を付与した上でスクリプトの1行目にShebangを記載しておくというものがあるかと思います。下記エントリのサンプルコードを拝借したスクリプトを作成します。
$ vi rundeck-job.python #!/usr/bin/env python # -*- coding: utf-8 -*- print("Hello Python!")
この様に指定をしておく事で、シェルを選択するだけでPythonプログラムが実行出来るようになります。
$ ./rundeck-job.python Hello Python!
所定のパスへのファイル移動、及び権限設定を済ませておき、
$ chmod +x rundeck-job.python $ sudo cp rundeck-job.python /home/rundeck/scripts/ $ sudo chown rundeck.rundeck /home/rundeck/scripts/rundeck-job.python $ ll /home/rundeck/scripts/ 合計 8 -rwxr-xr-x 1 rundeck rundeck 65 11月 23 15:02 rundeck-job-test.sh -rwxr-xr-x 1 rundeck rundeck 89 11月 23 17:20 rundeck-job.python $
ジョブのステップとしてパスを設定。
ジョブ実行。シェルスクリプト同様に、Rundeck経由で任意のPythonプログラムを実行させる事が出来ました。
S3に配置したスクリプトファイルを読み込んで実行
今回試した経路では、任意のパスの他にも『任意のURL』からスクリプトファイルを読み込み、その内容を実行するという設定も行えます。
上記で試したスクリプトファイル2つを任意のS3バケットにアップロードし、外部からダウンロード出来るようにPublicアクセス可能な形に設定します。
S3バケット上でのURLをジョブのステップとして設定し、実行してみます。問題無く処理が行えている様ですね!
アクセス制限について
上記設定でS3にアップロードしたファイルの実行が行えましたが、publicアクセス可能な形に設定した状態になっているのでセキュリティ面では不安があります。こちらについては併せてバケットへのアクセスをIPアドレスで制限する等の対策も施しておく必要があるでしょう。詳細な手順については以下のエントリ等をご参照ください。
- AWS管理コンソールへのアクセスをIPアドレスで制限したい | Developers.IO
- バケットポリシーの例 - Amazon Simple Storage Service
- S3でIP制限 - Qiita
まとめ
Rundeckのジョブにスクリプトファイルを読み込ませて実行する際の手順についてのご紹介でした。恐らくは本番利用する場合の手順としてもこの形が最も多く活用される形なのではと思っています。幾つかルールはありますが、この辺りを上手く踏まえて活用して行きたいところですね。こちらからは以上です。